#include "tou.h"

//储存信息内容
TT LTNR[1024];
int ChatMessageQuantity=0;
//储存好友申请
TT HYSQ[100];
int ApplyMessageQuantity=0;
//储存好友列表
TT HYLB[1024];
int FrindQuantity=0;

//链接服务器
void linkedServer(void)
{
   //服务器的地址
    unsigned int ip;
    //把字符串IP转为网络（大端）字节序
    inet_pton(AF_INET,"172.23.194.60",&ip);
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;//IPV4地址族
    addr.sin_port = htons(9000);//转成网络字节序的端口号
    addr.sin_addr.s_addr = ip;//网络字节序IP地址

    // 如果要通信，就需要创建socket，返回SOCKET的文件描述符
    //参数1：地址族IPV4
    //参数2：流式SOCKET(tcp协议)
    //参数3：自动网络协议
    SERVERFD = socket(AF_INET,SOCK_STREAM,0);

    //连接服务器
    //参数1：用来通信的SOCEKT
    //参数2：服务器的地址
    //参数3：服务器的地址结构体长度
    if(-1 == connect(SERVERFD,(struct sockaddr *)&addr,sizeof(addr)))
    {
        printf("连接服务器出错，服务器没有开或者断网了?\n");
    }
}

//刷新更新用户信息
void UpdateUserInformation()
{
    BUF upuser;
    upuser.choice=ALLMES;
    write(SERVERFD,&upuser,sizeof(BUF));
    //用户聊天信息接收
    read(SERVERFD,&upuser,sizeof(BUF));
    COUNT *tmpshu=(COUNT*)upuser.buf;
    ChatMessageQuantity=tmpshu->quantity;
    if(ChatMessageQuantity!=0)
    {
        for(int i=0;i<ChatMessageQuantity;i++)
        {
            read(SERVERFD,&upuser,sizeof(BUF));
            strcpy(LTNR[i].sq,upuser.buf);
        }
    }
    //用户好友申请接收
    read(SERVERFD,&upuser,sizeof(BUF));
    tmpshu=(COUNT*)upuser.buf;
    ApplyMessageQuantity=tmpshu->quantity;
    if(ApplyMessageQuantity!=0)
    {
        for(int i=0;i<ApplyMessageQuantity;i++)
        {
            read(SERVERFD,&upuser,sizeof(BUF));
            strcpy(HYSQ[i].sq,upuser.buf);
        }
    }
    //------------------------------------------------------用户好友列表接收-----------------------------------------
    read(SERVERFD,&upuser,sizeof(BUF));
    tmpshu=(COUNT*)upuser.buf;
    FrindQuantity=tmpshu->quantity;
    if(FrindQuantity!=0)
    {
        for(int i=0;i<FrindQuantity;i++)
        {
            read(SERVERFD,&upuser,sizeof(BUF));
            strcpy(HYLB[i].sq,upuser.buf);
        }
    }
}

int main()
{
    //链接服务器
    linkedServer();
    //传送结构体
    BUF *USERBUF=malloc(sizeof(BUF));
    while (1)
    {
        printf("1.注册 2.登录 3.找密 4.退出\n");
        char xuan[8];   //用户选择
        scanf("%s",xuan);
        if(!strcmp(xuan,"1"))//输入独一无二的手机号注册返回账号
        {
            USERBUF->choice=INQUIRE;
            zhuce(USERBUF);
        }
        else if(!strcmp(xuan,"2"))//登录并进入个人用户
        {
            USERBUF->choice=LOGIN;
            int ret=denglu(USERBUF);
            memset(USERBUF,0,sizeof(BUF));
            while(ret)
            {
                memset(USERBUF,0,sizeof(BUF));
                char xuan2[8];
                //刷新更新用户信息
                UpdateUserInformation();
                printf("1.查找账号(添加好友) 2.打印好友列表(发送消息) 3.群聊 4.未读信息(%d) 5.好友申请(%d) 6.刷新 7.退出登录\n",ChatMessageQuantity,ApplyMessageQuantity);
                scanf("%s",xuan2);
                if(!strcmp(xuan2,"1"))//查找账号
                {
                    USERBUF->choice=FINDACCOUNT;
                    addFriend(USERBUF);
                }
                else if(!strcmp(xuan2,"2"))//打印好友列表(发送消息)
                {
                    if(FrindQuantity==0)
                    {
                        printf("好友列表为空。\n");                            
                    }
                    else
                    {       
                        for(int i=0;i<FrindQuantity;i++)
                        {
                            printf("%s\n",HYLB[i].sq);
                        } 
                        while(1)
                        {
                            FASONG FSTIAN;  
                            memset(USERBUF,0,sizeof(BUF));
                            printf("请输入你想聊天的账号(quit取消):\n");
                            scanf("%s",FSTIAN.haoyou);
                            getchar();
                            if(!strcmp(FSTIAN.haoyou,"quit")){break;}
                            //用来判断是否有该好友
                            int u=0;
                            for(int b=0;b<FrindQuantity;b++)
                            {
                                if(!strcmp(FSTIAN.haoyou,HYLB[b].sq))
                                {
                                    u=1;
                                    USERBUF->choice=ALONEJIA;//进入单独聊天
                                    write(SERVERFD,USERBUF,sizeof(BUF));
                                    pid_t pid=fork();
                                    if(pid>0)
                                    {
                                        while(1)
                                        {
                                            USERBUF->choice=ALONECHAT;//单独聊天
                                            printf("给%s发送(quit退出):\n",FSTIAN.haoyou);
                                            scanf("%s",FSTIAN.neirong);
                                            getchar();
                                            if(!strcmp(FSTIAN.neirong,"quit"))
                                            {
                                                USERBUF->choice=ALONETUI;//退出聊天
                                                write(SERVERFD,USERBUF,sizeof(BUF));
                                                kill(pid,SIGKILL);//杀死子进程
                                                break;
                                            }
                                            memcpy(USERBUF->buf,&FSTIAN,sizeof(FASONG));
                                            write(SERVERFD,USERBUF,sizeof(BUF));
                                            memset(FSTIAN.neirong,0,sizeof(char)*980);
                                        }
                                    }
                                    //子进程用来接收消息
                                    else
                                    {
                                        char zxcv[1024];
                                        while(1)
                                        {
                                            int ret=read(SERVERFD,zxcv,sizeof(BUF));
                                            BUF *nn=(BUF*)zxcv;
                                            if(ret == 0 || ret == -1) {break;}
                                            FASONG *hehe=(FASONG*)nn->buf;
                                            printf("%s发送过来:%s\n",hehe->haoyou,hehe->neirong);
                                            memset(zxcv,0,sizeof(BUF));
                                        }
                                    }
                                }
                            }
                            if(u==0){printf("没有添加该好友？\n");}
                        }   
                    }
                }
                else if(!strcmp(xuan2,"3"))//群聊没做完全用的聊天结构体没有单独开一个结构体，但能正常使用，消息也存放在所有消息里面，默认已读，不过类型为群聊消息
                {
                    pid_t pid=fork();
                    if(pid>0)
                    {
                        USERBUF->choice=ALONEJIA;
                        write(SERVERFD,USERBUF,sizeof(BUF));
                        while(1)
                        {
                            memset(USERBUF,0,sizeof(BUF));
                            USERBUF->choice=CHAT_GROUP;
                            printf("输入:\n");
                            scanf("%s",USERBUF->buf);
                            getchar();
                            if(!strcmp(USERBUF->buf,"quit"))
                            {
                                USERBUF->choice=ALONETUI;//退出聊天
                                write(SERVERFD,USERBUF,sizeof(BUF));
                                kill(pid,SIGKILL);
                                break;
                            }
                            else
                            {
                                write(SERVERFD,USERBUF,sizeof(BUF));
                            }
                        }
                    }
                    else
                    {
                        char zibuf[1024];
                        while(1)
                        {
                            int ret=read(SERVERFD,zibuf,sizeof(BUF));
                            BUF *nn=(BUF*)zibuf;
                            if(ret == 0 || ret == -1) {break;}
                            FASONG *hehe=(FASONG*)nn->buf;
                            printf("%s发送过来(群聊信息):%s\n",hehe->haoyou,hehe->neirong);
                            memset(zibuf,0,sizeof(BUF));
                        }
                    }
                    
                }
                else if(!strcmp(xuan2,"4"))//进入即打印未读消息
                {
                    if(ChatMessageQuantity==0)            //未收到消息
                    {
                        printf("暂未收到好友消息。\n");
                    }
                    else
                    {
                        for(int i=0;i<ChatMessageQuantity;i++)
                        {
                            printf("%s\n",LTNR[i].sq);
                        }  
                        USERBUF->choice=YICHA;
                        write(SERVERFD,USERBUF,sizeof(BUF));                          
                    }
                }
                else if(!strcmp(xuan2,"5"))//进入即打印好友申请
                {
                        if(ApplyMessageQuantity==0)
                    {
                        printf("暂未收到任何好友申请。\n");
                    }
                    else
                    {
                        for(int i=0;i<ApplyMessageQuantity;i++)
                        {
                            printf("%s发来的好友申请\n",HYSQ[i].sq);
                        } 
                        while(1)
                        {
                            memset(USERBUF,0,sizeof(BUF));
                            printf("请输入你想处理的申请账号名(quit取消):\n");
                            scanf("%s",USERBUF->buf);
                            getchar();
                            if(!strcmp(USERBUF->buf,"quit")){break;}
                            int u=0;
                            for(int b=0;b<ApplyMessageQuantity;b++)
                            {
                                if(!strcmp(USERBUF->buf,HYSQ[b].sq))
                                {
                                    u=1;
                                    char p[8];
                                    printf("同意or拒绝(y/n,quit取消):\n");
                                    scanf("%s",p);
                                    if(!strcmp(p,"y"))
                                    {
                                        USERBUF->choice=YES;
                                        write(SERVERFD,USERBUF,sizeof(BUF));
                                        printf("已同意其好友申请。\n");
                                    }
                                    else if(!strcmp(p,"n"))
                                    {
                                        USERBUF->choice=NO;
                                        write(SERVERFD,USERBUF,sizeof(BUF)); 
                                        printf("已拒绝其好友申请。\n");
                                    }
                                    else if(!strcmp(p,"quit")){break;}
                                    else{printf("输入错误。\n");}  
                                }
                            }
                            if(u==0){printf("账号输入错误。\n");}
                        }                     
                    }
                }
                else if(!strcmp(xuan2,"6"))//无任何作用即刷新
                {}                    
                else if(!strcmp(xuan2,"7"))//退出登录
                {
                    USERBUF->choice=LOGOFF;
                    write(SERVERFD,USERBUF,sizeof(BUF));
                    ret=0;
                }
                else
                {
                    printf("暂时没有该操作。\n");
                }
            }
        }
        else if(!strcmp(xuan,"3"))//找密未做
        {
            USERBUF->choice=RETRIEVE;
        }
        else if(!strcmp(xuan,"4"))//结束
        {
            free(USERBUF);
            exit(0);
        }    
        else
        {
            printf("不支持该操作。\n");
        }   
        memset(xuan,0,8);
        memset(USERBUF,0,sizeof(BUF));
    }
    return 0;
}